
public class TestDemo2 {
    public static void main1(String[] args) {
//        1. 普通的String拼接 底层会被优化为StringBuilder
        String str1 = "asd";
        str1 += "123";
        System.out.println(str1);//asd123
//        2.     1和2的动作一样
        StringBuilder sb = new StringBuilder();
        sb.append("asd");
        sb.append("123");
        System.out.println(sb);//asd123
    }

    public static void main2(String[] args) {
//        1.
        String str1 = "asdqwe";
        for (int i = 0; i < 10; i++) {
            str1 += i;
        }
        System.out.println(str1);//asdqwe0123456789

//        2.      1和2的动作一样
        String str2 = "asdqwe";
        for (int i = 0; i < 10; i++) {
//            每次循环都会 new一个对象
            StringBuilder sb = new StringBuilder();
            sb.append(str2).append(i);
            str2 = sb.toString();
        }
        System.out.println(str2);//asdqwe0123456789


        System.out.println("===============");
//        3.优化
        String str3 = "asdqwe";
        StringBuilder sb1 = new StringBuilder();
        for (int i = 0; i < 10; i++) {
            sb1.append(str3).append(i);
            str3 = sb1.toString();
        }
        System.out.println(str3);// 这样写 在循环里 会多拼10个str3 所以是错误的
//          asdqwe0asdqwe01asdqwe0asdqwe012asdqwe0asdqwe01asdqwe0asdqwe0123asdqwe0as...
//        4.应该这样写   好处  不用每次循环都new一个对象
        String str4 = "asdqwe";
        StringBuilder sb2 = new StringBuilder();
        sb2.append(str4);
        for (int i = 0; i < 10; i++) {
            sb2.append(i);
            str4 = sb2.toString();
        }
        System.out.println(str4);//asdqwe0123456789
    }
//    结论：
//    如果是在循环里面进行字符串的拼接 尽量不要使用String
//    优先使用StringBuffer和StringBuilder
//    问题：
//    StringBuffer和StringBuilder有什么区别?
//    String的内容不可修改，StringBuffer与StringBuilder的内容可以修改.
//    StringBuffer与StringBuilder大部分功能是相似的
//    StringBuffer采用同步处理，属于线程安全操作；而StringBuilder未采用同步处理，属于线程不安全操作


    public static void main3(String[] args) {
        StringBuilder sb1 = new StringBuilder("abcdefg");
        sb1.reverse();//String没有reverse这个方法
        System.out.println(sb1);//gfedcba
        StringBuffer sb2 = new StringBuffer("asd");
        sb2.reverse();
        System.out.println(sb2);//dsa
    }


//    注意：
//    1.String和StringBuffer类不能直接转换。如果要想互相转换，可以采用如下原则:
//    2.String变为StringBuffer:利用StringBuffer的构造方法或append()方法
//    3.StringBuffer变为String:调用toString()方法。

//      StringBuffer或者StringBuilder--->String    调用toString方法
    public static String func2(){
        StringBuilder sb = new StringBuilder();
        return sb.toString();
    }
//      String---》StringBuffer或者StringBuilder 使用构造方法
    public static StringBuffer func1(){
//        1.
//        String str = "asdf";
//        return new StringBuffer(str);//要返回一个StringBuffer
//        2.
        String str = "asdf";
        StringBuffer sb = new StringBuffer();
        sb.append(str);
        return sb;
    }


}
